
${"string"?substring(2)}
<#-- 一、字符串函数 -->
<#-- 
substring ：   截取字符串
cap_first ：   整行文本的第一个字母转成大写 
uncap_first：  正行文本的第一个字母转成小写
capitalize：   每个单词的首字母大写
ends_with：    是否已某个字符串结束，返回bool
starts_with：  是否已某个字符串开始，返回bool
index_of：     某个串在字符串中第一次出现的位置
last_index_of：某个串在字符串中最后一次出现的位置
length：       字符串长度
left_pad：     左补齐，默认使用空格补齐，可以自己指定，如果超过需要的长度，直接返回字符串
right_pad：    右补齐，默认使用空格补齐，可以自己指定，如果超过需要的长度，直接返回字符串
contains：     是否包含某个字符串
replace：      把某个字符串替换成另外一个字符串
split：        把字符串分割成一个数组
trim：         去掉字符串首尾空格
word_list：    可以任意多的空格截取
  -->
截取字符串
${"abcde"?substring(1)}
<#noparse>${"abcde"?substring(0)}</#noparse>输出：
${"abcde"?substring(0)}
<#noparse>${"abcde"?substring(2,4)}</#noparse>输出：
${"abcde"?substring(2,4)}
整行文本的第一个字母转成大写（capital大小字母）
<#noparse>${"hello world"?cap_first}</#noparse>输出：
${"hello world"?cap_first}
正行文本的第一个字母转成小写
<#noparse>${"Hello World"?uncap_first}</#noparse>输出：
${"Hello World"?uncap_first}
每个单词的首字母大写
<#noparse>${"hello world"?capitalize}</#noparse>输出：
${"hello world"?capitalize}
是否已某个字符串结束，返回bool
${"hello world"?ends_with("ld2")?c}
是否已某个字符串开始，返回bool
${"hello world"?starts_with("hel")?c}
某个串在字符串中第一次出现的位置
${"hello world"?index_of("l")}
某个串在字符串中第一次出现的位置
${"hello world"?index_of("ll")}
某个串在字符串中最后一次出现的位置
${"hello world"?last_index_of("l")}
某个串在字符串中最后一次出现的位置
${"hello world"?last_index_of("ll")}
字符串长度
${"hello world"?length}
左补齐，默认使用空格补齐，可以自己指定，如果超过需要的长度，直接返回字符串
${"hello"?left_pad(10)}
-----------------------------
左补齐，默认使用空格补齐，可以自己指定 ，指定字符串，可以是多个字符
${"hello"?left_pad(10,"lx")}<#-- 指定字符串，可以是多个字符 -->
${"hello"?right_pad(2,".")}
${"hello"?right_pad(20,".")}
标题截取应用： 
<#assign title="hello" >
<#if ((title?length) > 10 ) >
	${title?substring(0,8)}..
	<#else>
	${title?right_pad(10)}
</#if>

-----------------------------
是否包含某个字符串
${"hello"?contains("l")?c}
把某个字符串替换成另外一个字符串
${"hello world"?replace("l","L")}

-----------------------------
split：        把字符串分割成一个数组
<#list "hellomygod,doit"?split("o") as w>
${w}
</#list>
<#list "hell,omy,god,doit"?split(",") as w>
${w}
</#list>

-----------------------------
trim：         去掉字符串首尾空格
<#noparse>|${"    test  "?trim}|</#noparse>输出：
|${"    test  "?trim}|

word_list：    可以任意多的空格截取
<#list "hello    world   hi "?word_list as wi>
${wi}
</#list>
-----------------------------
<#-- 二、数字函数 -->
<#-- 
c      : 把数字转换成字符串
string : 把数字转化成字符串，比上面的更加灵活
round  : 四舍五入
floor  : 向下取整
ceiling: 向上取整
  -->
 <#--  
 <#setting locale="hu">
  -->
在匈牙利语下，前面的会输出4,2，后面的会输出4.2
 ${4.2}  ${4.2?c}<#-- 在匈牙利语下，前面的会输出4,2，后面的会输出4.2 -->
 ${4.2?string.percent}<#-- 使用%比形式显示 -->
 ${4.2?string.currency}<#-- 使用金额形式显示 -->
 ${4.4?round}<#--四舍五入 -->
 ${4.7?floor}<#--舍掉小数 -->
 ${4.3?ceiling}<#--进位小数 -->
-----------------------------
<#-- 三、日期函数 -->
<#-- 
注意下面的now是从外面传入的数据模型
string("yyyy-MM-dd")：这种形式格式化
date：获取年月日
time：获取时分秒
datetime：年月日时分秒
  -->
 ${now?string("yyyy-MM-dd HH:mm:ss")}
 ${now?string("yyyy-MM-dd")}<#--MM值得日期，mm指的是 分钟 -->
 ${now?string("yyyy-M-dd")}<#--MM值得日期，mm指的是 分钟 -->
 ${now2?string("yyyy-M-dd")}<#--MM值得日期，mm指的是 分钟 -->
 ${now?string("HH:mm:ss")}
 ${now?date}
 ${now?time}
 ${now?datetime}
 
 <#-- 四、布尔函数 
 string：把bool转换成字符串
 -->
 
 ${true?c}
 ${true?string("是","否")}
 ${false?string("对","错")}
 
 <#-- 五、序列函数
 first：获取序列中第一个元素
 last：获取序列中最后一个元素
 seq_contains：是否包含某个元素
 seq_index_of：查找某个元素的位置
 seq_last_index_of：查找某个元素最后出现的位置，没有返回-1
 reverse:反转序列中的元素
 size:获取元素个数
 sort:排序
 sort_by:用于hash表的排序，可以指明根据那个字段排序
 chunk:把序列分成几个序列，可以指定填充元素
 -->
 <#assign seq=[9,8,5,4,6]>
 ${seq?first}
 ${seq?last}
 ${seq?seq_contains(4)?c}
 ${seq?seq_index_of(6)}
 ${seq?seq_index_of(7)}
 <#list seq?reverse as n>${n},</#list>
 ${seq?size}
 <#list seq?sort as n>${n},</#list>
 
 <#assign users=[{"name":"Tom","age":34},{"name":"Jim","age":56},{"name":"Tim","age":25},{"name":"Lucy","age":29}]>
 <#list users?sort_by("age")?reverse as n>${n.name}:${n.age},</#list>
 <#list users?sort_by("name") as n>${n.name}:${n.age},</#list>
 
 ----------------------------------
 chunk:把序列分成几个序列，可以指定填充元素
 chunk函数演示如下：
 <#assign seqChunk=[9,8,5,4,6]>
 <#list seqChunk?chunk(2) as m> <#-- 没一个小序列中包含两个元素 -->
 	分成子序列执行如下：
 	<#list m as mi>${mi},</#list>
 </#list>
 <#list seqChunk?chunk(2,"x") as m><#-- 如果小序列个数不足2，使用"x"补 -->
 	分成子序列执行如下（最后一个不够两个，用输入的变量进行补充）：
 	<#list m as mi>${mi},</#list>
 </#list>
 ----------------------------------
 <#-- 六、Hash函数 -->
 <#-- 
 keys:获取hash的所有key
 -->
 --------------------
 六、Hash函数 ： keys:获取hash的所有key
 <#assign h={"name":"Tom","age":34}>
 <#list h?keys as k>
 ${k}:${h[k]}
 </#list>
 <#list h?values as v>
 ${v}
 </#list>
 <#list data?keys as k>
 ${k}:${data[k]}
 </#list> 
 --------------------
 
 
 <#-- 七、自定义函数 -->
 <#-- 简单函数 -->
 <#function add num1 num2>
 	<#return num1+num2>
 </#function>
 
 ${add(3,4)}
 <#--可变参数的函数-->
 <#function addAll nums...>
 	<#local total=0>
 	${total}
 	<#list nums as n>
 		<#local total=total+n>
 		${total}
 	</#list>
 	<#return total>
 </#function>
 ${addAll(1,2,3,4,5)}
